import 'dart:typed_data';
import 'package:bluetooth_parse_plugin/src/lorin/lorin_cmd.dart';
import 'package:bluetooth_parse_plugin/src/lorin/lorin_enum.dart';

// 指令码枚举
enum LorinIntructionEnum {
  // 设备sn
  sn(
    "SN",
    LorinDataFormatType.norStcpp,
    LorinSourceDeviceType.human,
    LorinDataChannelType.info,
    LorinDataPropertyType.property2,
    0,
    null,
  ),

  // 实时信息
  realtimeInfo(
    "RealtimeInfo",
    LorinDataFormatType.speStcp,
    LorinSourceDeviceType.human,
    null,
    null,
    1,
    null,
  ),

  // 实时状态
  realtimeState(
    "RealtimeState",
    LorinDataFormatType.speStcp,
    LorinSourceDeviceType.human,
    null,
    null,
    2,
    null,
  ),

  // 实时错误
  realtimeError(
    "RealtimeError",
    LorinDataFormatType.speStcp,
    LorinSourceDeviceType.human,
    null,
    null,
    3,
    null,
  ),

  // 综合实时信息
  realtimeAll(
    "RealtimeAll",
    LorinDataFormatType.speStcp,
    LorinSourceDeviceType.human,
    null,
    null,
    4,
    null,
  ),

  // 综合实时信息
  realtimeInfoBMS(
    "RealtimeInfoBMS",
    LorinDataFormatType.speStcp,
    LorinSourceDeviceType.human,
    null,
    null,
    5,
    null,
  ),

  /* 综合实时信息
    【若读请求携带的参数为空】
    则应答如下：
    uint8_t 记录总数 0~64
    uint32_t index 最近一条记录的编号

    【若读请求携带的参数为 uint8_t 起始编号 + uint8_t 数目n】
    则应答如下：
    uint8_t 起始序号 + uint8_t 数目n + uint8_t 总数 + uint8_t 每条记录长度+VX_RECORD[n]
  */
  statisticOnce(
    "StatisticOnce",
    LorinDataFormatType.speStcp,
    LorinSourceDeviceType.human,
    null,
    null,
    16,
    null,
  ),

  // 累计统计数据
  statisticsTotal(
    "StatisticTotal",
    LorinDataFormatType.speStcp,
    LorinSourceDeviceType.human,
    null,
    null,
    17,
    null,
  ),

  // 综合设置
  settingsAll(
    "StatisticTotal",
    LorinDataFormatType.speStcp,
    LorinSourceDeviceType.human,
    null,
    null,
    32,
    null,
  );

  // 源设备
  int get sourceDevice => LorinSourceDeviceType.app.rawValue;

  // 目标设备
  int get targetDevice => target?.rawValue ?? 0;

  // 构建cmd
  Uint8List? get cmdList {
    switch (format) {
      case LorinDataFormatType.norCpp:
      case LorinDataFormatType.norTcpp:
      case LorinDataFormatType.norStcpp:
        return null;
      default:
        return cmdIntValue != null ? LorinCmd(cmdIntValue!).cmd : null;
    }
  }

  // 指令名称
  final String name;
  // 数据格式
  final LorinDataFormatType format;
  // 目标设备
  final LorinSourceDeviceType? target;
  // 通道类型
  final LorinDataChannelType? channel;
  // 属性
  final LorinDataPropertyType? property;
  // 指令码
  final int? cmdIntValue;
  // 参数
  final Uint8List? param;

  // 初始化
  const LorinIntructionEnum(
    this.name,
    this.format,
    this.target,
    this.channel,
    this.property,
    this.cmdIntValue,
    this.param,
  );
}
